package de.fhffm.gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.regex.Pattern;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class DuengerBearbeitenFenster implements ActionListener{
	private JButton btnSpeichern = new JButton("Speichern");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelMarke = new JLabel("Marke");
	private JLabel labelStickstoff = new JLabel("Stickstoff");
	private JLabel labelPhosphat = new JLabel("Phosphat");
	private JLabel labelKalium = new JLabel("Kalium");
	private JLabel labelMagnesium = new JLabel("Magnesium");
	
	private JTextField txtMarke = new JTextField(8);
	private JTextField txtStickstoff = new JTextField(8);
	private JTextField txtPhosphat = new JTextField(8);
	private JTextField txtKalium = new JTextField(8);
	private JTextField txtMagnesium = new JTextField(8);
	
	private JFrame duengerBearbeitenFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel(new GridLayout(5,2));
	private JPanel buttonPanel = new JPanel();
	
	private String marke = null;
	private String stickstoffString = null;
	private String phosphatString = null;
	private String kaliumString = null;
	private String magnesiumString = null;
	
	private int stickstoff = 0;
	private int phosphat = 0;
	private int kalium = 0;
	private int magnesium = 0;
	
	private List<String> ausgewaehlteZeile;
	
	StringBuilder sb = new StringBuilder();
	
	public DuengerBearbeitenFenster(List<String>ausgewaehlteZeile){
		
		this.ausgewaehlteZeile = ausgewaehlteZeile;
		
		duengerBearbeitenFrame.setTitle("Dünger bearbeiten");
		duengerBearbeitenFrame.setSize(400,500);
		duengerBearbeitenFrame.setLocationRelativeTo(null);
		duengerBearbeitenFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		duengerBearbeitenFrame.setVisible(true);
		duengerBearbeitenFrame.setResizable(true);
		duengerBearbeitenFrame.setLayout(new BorderLayout());
		
		eingabePanel.add(labelMarke);
		eingabePanel.add(txtMarke);
		eingabePanel.add(labelStickstoff);
		eingabePanel.add(txtStickstoff);
		txtStickstoff.setToolTipText("Menge des im Dünger enthaltenen Stickstoffs in %");
		eingabePanel.add(labelPhosphat);
		eingabePanel.add(txtPhosphat);
		txtPhosphat.setToolTipText("Menge des im Dünger enthaltenen Phosphats in %");
		eingabePanel.add(labelKalium);
		eingabePanel.add(txtKalium);
		txtKalium.setToolTipText("Menge des im Dünger enthaltenen Kaliums in %");
		eingabePanel.add(labelMagnesium);
		eingabePanel.add(txtMagnesium);
		txtMagnesium.setToolTipText("Menge des im Dünger enthaltenen Magnesiums in %");
		
		buttonPanel.add(btnSpeichern);
		buttonPanel.add(btnAbbrechen);
		
		btnSpeichern.addActionListener(this);
		btnAbbrechen.addActionListener(this);
		
		duengerBearbeitenFrame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		duengerBearbeitenFrame.getContentPane().add(eingabePanel, BorderLayout.CENTER);
		
		fuelleTextfelder();
		
	}
	
	private void fuelleTextfelder() {
		String[] teilString;
		txtMarke.setText(ausgewaehlteZeile.get(0));
		teilString = ausgewaehlteZeile.get(1).split(Pattern.quote(" ")); // % entfernen
		txtKalium.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(2).split(Pattern.quote(" "));
		txtMagnesium.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(3).split(Pattern.quote(" "));
		txtPhosphat.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(4).split(Pattern.quote(" "));
		txtStickstoff.setText(teilString[0]);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		
		if(obj == btnAbbrechen){
			duengerBearbeitenFrame.dispose();
		}
		
		if(obj == btnSpeichern){
			
			if(ueberpruefeEingabe()){
				
				speicherAenderungen();
				speichernEnde();
				
			}else{
				
				System.out.println("Eingabe Fehler");
			}
		}
	}
	
	private void speichernEnde() {
		
		Object[] options = {"Fertig!","Weiter bearbeiten"};
		int selected = JOptionPane.showOptionDialog(null,"Dünger erfolgreich bearbeitet!", "Änderungen gespeichert", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			duengerBearbeitenFrame.dispose();
			break;
		case 1:
			duengerBearbeitenFrame.dispose();
			new BearbeitenTabellenFenster(2);
			break;
		}
	}

	private void speicherAenderungen() {
		
		String originalMarke = ausgewaehlteZeile.get(0);
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("UPDATE Duenger d SET d.duengerMarke =:marke, d.kalium =:kalium, d.magnesium =:magnesium, d.phosphat =:phosphat, d.stickstoff =:stickstoff WHERE d.duengerMarke =:orgMarke");
				  q.setParameter("marke", marke);
				  q.setParameter("kalium", kaliumString);
				  q.setParameter("magnesium", magnesiumString);
				  q.setParameter("phosphat", phosphatString);
				  q.setParameter("stickstoff", stickstoffString);
				  q.setParameter("orgMarke", originalMarke);	  
				  q.executeUpdate();
		em.getTransaction().commit();
		em.close();
	}

	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Phosphat,Magnesium, Kalium und Stickstoff nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {
		
		marke = txtMarke.getText();
		stickstoff = Integer.parseInt(txtStickstoff.getText());
		sb.append(stickstoff).append(" %");
		stickstoffString = sb.toString();
		sb.setLength(0);
		phosphat = Integer.parseInt(txtPhosphat.getText());
		sb.append(phosphat).append(" %");
		phosphatString = sb.toString();
		sb.setLength(0);
		kalium = Integer.parseInt(txtKalium.getText());
		sb.append(kalium).append(" %");
		kaliumString = sb.toString();
		sb.setLength(0);
		magnesium = Integer.parseInt(txtMagnesium.getText());
		sb.append(magnesium).append(" %");
		magnesiumString = sb.toString();
		sb.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
		
		}else{
			
			return true;

		}
	}
		
		private boolean isEingabeLeer() {
			
			if(marke.length() == 0 || stickstoff <= -1 || phosphat <= -1 || kalium <= -1 || magnesium <= -1){
			
				return true;
			
			}else{
			
				return false;
			}
		}
}
